home *** CD-ROM | disk | FTP | other *** search
/ Programming Languages Suite / ProgramD2.iso / Borland / Borland C++ V5.02 / DIAGXPRT.PAK / SERIALZE.CPP < prev    next >
C/C++ Source or Header  |  1997-05-06  |  3KB  |  123 lines

  1. //----------------------------------------------------------------------------
  2. // ObjectWindows
  3. // (C) Copyright 1995, 1995 by Borland International, All Rights Reserved
  4. //
  5. // Implements TSerializer, TSerializeReceiver
  6. //----------------------------------------------------------------------------
  7. #include <owl/owlpch.h>
  8. #include "serialze.h"
  9.  
  10. //
  11. // Breaks down the data into blocks and sends each block to the window via SendMessage.
  12. // wParam of the SendMessage is of type BlockType which signifies what
  13. // lParam contains.
  14. //
  15. TSerializer::TSerializer(HWND hwndTarget, uint32 length, void* data)
  16. {
  17.   if (!::IsWindow(hwndTarget) || length == 0)
  18.     return;
  19.   uint msg = ::RegisterWindowMessage(SerializerMessage);
  20.  
  21.   ::SendMessage(hwndTarget, msg, Begin, length);
  22.  
  23.   // send blocks 4 at a time
  24.   //
  25.   uint32* dataBlocks = (uint32*)data;
  26.   while (length > 3) {
  27.     ::SendMessage(hwndTarget, msg, Data4, *dataBlocks);
  28.     dataBlocks += 1;
  29.     length -= 4;
  30.   }
  31.  
  32.   // block was an even multiple of 4
  33.   //
  34.   if (length == 0)
  35.     return;
  36.  
  37.   // length must be either 1, 2, or 3
  38.   //
  39.   unsigned char* dataBytes = (unsigned char*)dataBlocks;
  40.   uint32 finalBlock = 0;
  41.  
  42.   if (length == 3)
  43.     finalBlock += 0x100L * dataBytes[2];
  44.  
  45.   if (length >= 2)
  46.     finalBlock += 0x10000L * dataBytes[1];
  47.  
  48.   finalBlock += 0x1000000L * dataBytes[0];
  49.  
  50.   ::SendMessage(hwndTarget, msg, length, finalBlock);
  51.   ::SendMessage(hwndTarget, msg, End, 0);
  52. }
  53.  
  54.  
  55. //
  56. // Constructor
  57. //
  58. TSerializeReceiver::TSerializeReceiver()
  59. :
  60.   TEventHandler(), Length(0), Data(0), CurPtr(0)
  61. {
  62. }
  63.  
  64. //
  65. // Automatically put the data blocks back together.
  66. //
  67. int32
  68. TSerializeReceiver::BlockReceived(uint wParam, int32 lParam)
  69. {
  70.   switch (wParam) {
  71.     case TSerializer::Begin: {
  72.       Length = lParam;
  73.       Data = new HUGE char[Length+1];
  74.       CurPtr = Data;
  75.       return 0;
  76.     }
  77.  
  78.     case TSerializer::End: {
  79.       DataReceived(Length, Data);
  80.       delete[] Data;
  81.       Data = 0;
  82.       return 0;
  83.     }
  84.  
  85.     case TSerializer::Data4: {
  86.       uint32* ptr = (uint32*)CurPtr;
  87.       *ptr = lParam;
  88.       CurPtr += 4;
  89.       return 0;
  90.     }
  91.  
  92.     case TSerializer::Data1:
  93.     case TSerializer::Data2:
  94.     case TSerializer::Data3:
  95.       break;
  96.  
  97.     default: // ignored, unknown BlockType
  98.       return 0;
  99.   }
  100.  
  101.   *CurPtr++ = (char)HIBYTE(HIWORD(lParam));
  102.  
  103.   if (wParam >= TSerializer::Data2)
  104.     *CurPtr++ = (char)LOBYTE(HIWORD(lParam));
  105.  
  106.   if (wParam == TSerializer::Data3)
  107.     *CurPtr++ = (char)HIBYTE(LOWORD(lParam));
  108.  
  109.   *CurPtr++ = 0;
  110.  
  111.   return 0;
  112. }
  113.  
  114. void
  115. TSerializeReceiver::DataReceived(uint32 length, void* data)
  116. {
  117.  
  118. }
  119.  
  120. DEFINE_RESPONSE_TABLE1(TSerializeReceiver, TEventHandler)
  121.   EV_REGISTERED(SerializerMessage, BlockReceived),
  122. END_RESPONSE_TABLE;
  123.